package entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import util.UtilColecao;
import enumeration.AlterarRecorrenciaEnum;
import enumeration.TipoTransacaoEnum;

@Entity
public class Transacao extends EntityManaged implements Serializable {

    private static final long serialVersionUID = 1082824403447060113L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String descricao;

    @Temporal(TemporalType.DATE)
    private Date dataTransacao;

    @Transient
    private Date dataPagamento;

    @Transient
    private boolean quitada;

    @Transient
    private int qtdaParcelasInformadas;

    @Transient
    private boolean importar;

    @Transient
    private BigDecimal valorTotal;

    @Transient
    private BigDecimal valorParcela;

    @ManyToOne
    private CategoriaTransacao categoriaTransacao;

    @Enumerated(EnumType.ORDINAL)
    private TipoTransacaoEnum tipoTransacao;

    @OneToOne
    private Transacao transacao;

    @OneToMany(mappedBy = "transacao", cascade = CascadeType.ALL)
    private List<ParcelaTransacao> listaParcelas;

    @ManyToOne
    private Conta conta;

    @Transient
    private Fatura faturaParcela;

    @ManyToOne
    private RecorrenciaTransacao recorrenciaTransacao;

    @Transient
    private boolean repetir;

    @Transient
    private AlterarRecorrenciaEnum alterarRecorrencia;
    
    private boolean ehDestino;

    @Override
    public Long getId() {
	return id;
    }

    public void setId(Long id) {
	this.id = id;
    }

    public String getDescricao() {
	return descricao;
    }

    public void setDescricao(String descricao) {
	this.descricao = descricao;
    }

    public Integer getQtdaParcelas() {

	return UtilColecao.isColecaoVazia(listaParcelas) ? 0 : listaParcelas
		.size();
    }

    public int getQtdaParcelasInformadas() {
	return qtdaParcelasInformadas;
    }

    public void setQtdaParcelasInformadas(int qtdaParcelasInformadas) {
	this.qtdaParcelasInformadas = qtdaParcelasInformadas;
    }

    public BigDecimal getValorTotal() {
	return valorTotal;
    }

    public void setValorTotal(BigDecimal valorTotal) {
	this.valorTotal = valorTotal;
    }

    public BigDecimal getValorParcela() {
	if (valorTotal != null) {
	    return valorTotal
		    .divide(BigDecimal.valueOf(qtdaParcelasInformadas));
	} else {
	    return BigDecimal.ZERO;
	}
    }

    public Fatura getFaturaParcela() {
	return faturaParcela;
    }

    public void setFaturaParcela(Fatura faturaParcela) {
	this.faturaParcela = faturaParcela;
    }

    public boolean isImportar() {
	return importar;
    }

    public void setImportar(boolean importar) {
	this.importar = importar;
    }

    public Conta getConta() {
	return conta;
    }

    public void setConta(Conta conta) {
	this.conta = conta;
    }

    public void setValorParcela(BigDecimal valorParcela) {
	this.valorParcela = valorParcela;
    }

    public Date getDataTransacao() {
	return dataTransacao;
    }

    public void setDataTransacao(Date dataTransacao) {
	this.dataTransacao = dataTransacao;
    }

    public List<ParcelaTransacao> getListaParcelas() {
	return listaParcelas;
    }

    public void setListaParcelas(List<ParcelaTransacao> listaParcelas) {
	this.listaParcelas = listaParcelas;
    }

    public boolean isQuitada() {
	return quitada;
    }

    public void setQuitada(boolean quitada) {
	this.quitada = quitada;
    }

    public TipoTransacaoEnum getTipoTransacao() {
	return tipoTransacao;
    }

    public void setTipoTransacao(TipoTransacaoEnum tipoTransacao) {
	this.tipoTransacao = tipoTransacao;
    }

    public CategoriaTransacao getCategoriaTransacao() {
	return categoriaTransacao;
    }

    public Transacao getTransacao() {
	return transacao;
    }

    public void setCategoriaTransacao(CategoriaTransacao categoriaTransacao) {
	this.categoriaTransacao = categoriaTransacao;
    }

    public void setTransacao(Transacao transacao) {
	this.transacao = transacao;
    }

    public Date getDataPagamento() {
	return dataPagamento;
    }

    public void setDataPagamento(Date dataPagamento) {
	this.dataPagamento = dataPagamento;
    }

    public RecorrenciaTransacao getRecorrenciaTransacao() {
	return recorrenciaTransacao;
    }

    public void setRecorrenciaTransacao(
	    RecorrenciaTransacao recorrenciaTransacao) {
	this.recorrenciaTransacao = recorrenciaTransacao;
    }

    public boolean isRepetir() {
	return repetir;
    }

    public void setRepetir(boolean repetir) {
	this.repetir = repetir;
    }

    public AlterarRecorrenciaEnum getAlterarRecorrencia() {
	return alterarRecorrencia;
    }

    public void setAlterarRecorrencia(AlterarRecorrenciaEnum alterarRecorrencia) {
	this.alterarRecorrencia = alterarRecorrencia;
    }

    public boolean isEhDestino() {
        return ehDestino;
    }

    public void setEhDestino(boolean ehDestino) {
        this.ehDestino = ehDestino;
    }

}
